package day26.yichang;

/**
 * Java异常处理基本示例
 * 演示try-catch-finally的基本用法
 * 异常处理是Java中处理运行时错误的机制，防止程序因为错误而中断执行
 */
public class BasicExceptionDemo {
    public static void main(String[] args) {
        System.out.println("=== Java异常处理基本示例 ===");
        
        // 示例1: 捕获ArithmeticException（算术异常）
        // 当进行非法算术运算时会抛出此异常，如除以零
        try {
            // 尝试进行除零操作，这在数学上是未定义的，会抛出ArithmeticException异常
            int result = 10 / 0; // 会产生ArithmeticException
            System.out.println("计算结果: " + result);
        } catch (ArithmeticException e) {
            // 捕获并处理算术异常，getMessage()方法返回异常的详细信息
            System.out.println("捕获到算术异常: " + e.getMessage());
        }
        
        // 示例2: 捕获多种异常
        // 演示如何使用多个catch块处理不同类型的异常
        try {
            // 创建一个长度为5的整型数组
            int[] arr = new int[5];
            // 尝试访问数组索引10的位置，超出了数组边界(0-4)，会抛出ArrayIndexOutOfBoundsException
            arr[10] = 100; // 会产生ArrayIndexOutOfBoundsException
        } catch (ArithmeticException e) {
            // 捕获算术异常（在此示例中不会发生）
            System.out.println("算术异常: " + e.getMessage());
        } catch (ArrayIndexOutOfBoundsException e) {
            // 捕获数组越界异常，这是实际会发生的异常
            System.out.println("数组越界异常: " + e.getMessage());
        } catch (Exception e) {
            // 捕获所有其他类型的异常，Exception是所有异常类的父类
            // 这个catch块应该放在最后，因为要遵循从具体到一般的顺序
            System.out.println("其他异常: " + e.getMessage());
        }
        
        // 示例3: 使用finally块
        // finally块中的代码无论是否发生异常都会执行，通常用于释放资源
        try {
            // 声明一个空字符串引用
            String str = null;
            // 尝试调用null对象的方法，会抛出NullPointerException空指针异常
            System.out.println(str.length()); // 会产生NullPointerException
        } catch (NullPointerException e) {
            // 捕获并处理空指针异常
            System.out.println("空指针异常: " + e.getMessage());
        } finally {
            // finally块中的代码总是会执行，无论前面是否发生异常
            // 常用于关闭文件、释放资源等清理工作
            System.out.println("无论是否有异常，finally块都会执行");
        }
        
        // 示例4: try-with-resources语句
        // Java 7引入的自动资源管理机制，实现AutoCloseable接口的资源会自动关闭
        // 不需要显式调用close()方法
        try (java.util.Scanner scanner = new java.util.Scanner(System.in)) {
            // Scanner实现了AutoCloseable接口，在try块结束后会自动关闭
            System.out.println("请输入一个数字(演示try-with-resources): ");
            // 注意: 这里为了演示，不实际读取输入，避免运行时需要用户输入
            System.out.println("try-with-resources示例完成");
        } catch (Exception e) {
            // 捕获Scanner操作过程中可能发生的异常
            System.out.println("Scanner操作异常: " + e.getMessage());
        }
        
        System.out.println("程序正常结束");
    }
}